﻿/****************************************************
	文件：SingletonMono.cs
	作者：WithoutUmbrella_Boy
	邮箱: 1026188730@qq.com
	日期：2021/02/14 21:56   	
	功能：继承MonoBehaviour的单例模式基类
*****************************************************/
#region 注意事项
//当使用的类是继承MonoBehaviour的单例模式基类（SingletonMono<T> ）时，要确保在unity场景中只有一个物体挂载了该脚本组件，负责会直接破坏单例模式的概念
//多次给单例赋值的话，系统只会取最后一个赋值的变量，这样的话相当于浪费了系统资源
//继承了 MonoBehaviour 的 单例模式对象 需要我们自己保证它的位移性
#endregion
using UnityEngine;

//1.C#中 泛型的知识
//2.设计模式中 单例模式的知识
//3.多线程当中需要加入双锁，小项目基本不会用到多线程
//4.继承了 MonoBehaviour 的 单例模式对象 需要我们自己保证它的位移性
public class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour  //里氏转换原则，父类装子类
{
    private static T instance;

    public static T GetInstance()
    {
        // 继承了Mono的脚本不能够直接new
        //只能通过拖动到对象上或者通过加脚本的api AddComponent却脚本
        // U3D内部帮助我们实例化它
        return instance;
    }

    //之所以将Awake写成protected virtual，那是因为当其他类继承自SingletonMono<T>，又需要调用unity当中的Awake方法的时候就会出错，所以需要写成protected virtual
    //等到需要的时候在重写Awake方法，并用base.Awake()调用父类的Awake()方法，这样保证单例的顺利赋值
    protected virtual void Awake() 
    {
        instance = this as T;
    }
}
